##
# 用户信息
# @项目名： fc_weather
# 作者： ZiChen
# 创建时间:  2021-01-01 09:39:30
##


# 导入库
from requests import get as requests_get
from bs4 import BeautifulSoup
from datetime import datetime
from rich.console import Console
console = Console()  # 创建控制台
# 用requests库的get()方法简明地获取网页信息。第一个函数返回一个网页内容---r.text.


def getHTMLText(url):
    '''
    该函数是为了获取网页信息
    '''
    try:
        r = requests_get(url, timeout=30)  # 用requests抓取网页信息
        r.raise_for_status()  # 可以让程序产生异常时停止程序
        r.encoding = r.apparent_encoding
        return r.text
    except:
        console.print_exception()

# 根据我们之前分析的网页结构的标签树，用 Beautiful Soup 方法解析网页结构，用find（）找到对应的标签。
# 再在标签中遍历元素，将其中的文本内容添加到 temp_list 中，再将 temp_list 添加到 final_list 中，最后返回 final_list.


def get_data(html):
    '''
    该函数是从网页中爬取数据，并保存在一个列表中
    '''
    final_list = []
    soup = BeautifulSoup(html, 'html.parser')  # 用BeautifulSoup库解析网页
    body = soup.body
    data = body.find('div', {'id': '7d'})
    ul = data.find('ul')
    lis = ul.find_all('li')

    for day in lis:
        temp_list = []

        date = day.find('h1').string  # 找到日期
        temp_list.append(date)

        info = day.find_all('p')  # 找到所有的p标签
        temp_list.append(info[0].string)

        if info[1].find('span') is None:  # 找到p标签中的第二个值'span'标签——最高温度
            temperature_highest = ' '  # 用一个判断是否有最高温度
        else:
            temperature_highest = info[1].find('span').string
            temperature_highest = temperature_highest.replace('℃', ' ')

        if info[1].find('i') is None:  # 找到p标签中的第二个值'i'标签——最高温度
            temperature_lowest = ' '  # 用一个判断是否有最低温度
        else:
            temperature_lowest = info[1].find('i').string
            temperature_lowest = temperature_lowest.replace('℃', ' ')

        temp_list.append(temperature_highest)  # 将最高气温添加到temp_list中
        temp_list.append(temperature_lowest)  # 将最低气温添加到temp_list中

        final_list.append(temp_list)  # 将temp_list列表添加到final_list列表中
    return final_list


def Information_pack(final_list, num):
    '''
    该函数用来将天气信息进行包装，用作发送
    参数：
    final_list 已完成的天气数据列表
    num 需要写入天气的天数（从本天开始算起，如num=2，则读取数据中今天和明天的天气数据）
    '''
    Time = str(datetime.today()).split('.')[0]  # 获取数据的时间
    weather_lst = ['']  # 天气数据
    for i in range(num):  # 用.insert()拼接字符
        final = final_list[i]
        # {^+数字} ：居中，后面带宽度
        temporary = "[{}]\n天气：{}    温度：{}~{}\n".format(
            final[0], final[1], final[3], final[2])
        weather_lst.insert(-1, temporary)
    weather_str = ''.join(weather_lst)  # 用join()处理列表

    message = ("{orange}\n\
[Weather]\n\
数据获取时间:  {Time}\n\
{weather}\n\
        ".format(orange='[#ffb74d]',
                 Time=Time,
                 weather=weather_str)
               )
    console.print('[#ffb74d]%s' % message)


# 主函数，将各个函数连接起来
def main(day):
    '''
    day 需要查看的天数
    '''
    if day > 7:
        console.print(
            '[red]The query time cannot exceed seven days!\n查询时间不能超过七天！\n')
    else:
        url = 'http://www.weather.com.cn/weather/101280501.shtml'  # 爬取天气所在网址
        html = getHTMLText(url)  # 根据网址获取网页html
        final_list = get_data(html)  # 获取html内的内容
        Information_pack(final_list, day)  # 将内容包装发送
